home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / Adobe Illustrator Plug-ins / AIQuickCapture Project / source / quickcapture.c < prev    next >
C/C++ Source or Header  |  1996-06-22  |  8KB  |  420 lines

  1. /* ---------------------------------------------------------------------------
  2.  
  3.     quickcam capture.c
  4.  
  5.     Copyright (c) 1995-6 Adobe Systems Incorporated
  6.     All Rights Reserved
  7.     
  8.    --------------------------------------------------------------------------- */
  9.  
  10. /**-----------------------------------------------------------------------------
  11.  **
  12.  **    Imports
  13.  **
  14.  **/
  15.  
  16.  
  17.  
  18. #include "common.h"
  19.  
  20.  
  21. /**-----------------------------------------------------------------------------
  22.  **
  23.  **    Variables and declarations
  24.  **
  25.  **/
  26.  
  27.  
  28. typedef struct {    
  29.     char *name;        
  30.     long version;
  31.     void **suite;
  32. } ImportBunch;
  33.  
  34. typedef struct {    
  35.     char *name;        
  36.     long version;
  37. } ExportBunch;
  38.  
  39.  
  40.  
  41. Globals *g;
  42.  
  43. // Add the properties to import here
  44. ImportBunch imports[] = {
  45.  
  46.     kAIBlockSuite, kAIBlockVersion, &sBlock,
  47.     kAIMenuSuite, kAIMenuVersion, &sMenu,
  48.     kAIMacMenuSuite, kAIMacMenuVersion, &sMacMenu,    
  49.     kAIMacUserSuite, kAIMacUserVersion, &sMacUser,
  50.  
  51.     kAIFixedMathSuite, kAIFixedMathVersion, &sMath,
  52.     kAIArtSuite, kAIArtVersion, &sArt,
  53.     kAIRasterSuite, kAIRasterVersion, &sRaster,
  54.  
  55.     kAIDocumentViewSuite, kAIDocumentViewVersion2, &sDocumentView,
  56.  
  57. };
  58. ExportBunch exports[] = {
  59.  
  60.     "hide windows", 1
  61.  
  62. };
  63.  
  64.  
  65. AIBlockSuite *sBlock;
  66. AIMenuSuite *sMenu;
  67. AIMacMenuSuite *sMacMenu;
  68. AIMacUserSuite *sMacUser;
  69.  
  70. AIFixedMathSuite *sMath;
  71. AIArtSuite *sArt;
  72. AIRasterSuite *sRaster;
  73. AIDocumentViewSuite2 *sDocumentView;
  74.  
  75.  
  76. #include "menuHandler.h"
  77.  
  78.  
  79. /**-----------------------------------------------------------------------------
  80.  **
  81.  **    Forward Functions
  82.  **
  83.  **/
  84. static FXErr AcquireProperty( AIPropertyMessage *message );
  85. static FXErr ReleaseProperty( AIPropertyMessage *message );
  86.  
  87. static FXErr StartupPlugin( AIPluginMessage *message );
  88. static FXErr UnloadPlugin( AIPluginMessage *message );
  89. static FXErr ReloadPlugin( AIPluginMessage *message );
  90. static FXErr ShutdownPlugin( AIPluginMessage *message );
  91. static FXErr AboutPlugin( AIPluginMessage *message );
  92.  
  93. /*******************************************************************************
  94.  **
  95.  **    Exported Functions
  96.  **
  97.  **/
  98.  
  99. FXErr main( char *selector, void *message );
  100. FXErr main( char *selector, void *message ) {    
  101.  
  102.     PUSH_GLOBALS
  103.     FXErr error = kNoErr;
  104.  
  105. // standard messages
  106.     if ( strcmp( selector, kSelectorAIAcquireProperty ) == 0 )
  107.         error = AcquireProperty( message );
  108.  
  109.     else if ( strcmp( selector, kSelectorAIReleaseProperty ) == 0 )
  110.         error = ReleaseProperty( message );
  111.  
  112.     else if ( strcmp( selector, kSelectorAIUnloadPlugin ) == 0 )
  113.         error = UnloadPlugin( message );
  114.  
  115.     else if ( strcmp( selector, kSelectorAIReloadPlugin ) == 0 )
  116.         error = ReloadPlugin( message );
  117.  
  118.     else if ( strcmp( selector, kSelectorAIShutdownPlugin ) == 0 )
  119.         error = ShutdownPlugin( message );
  120.  
  121.     else { 
  122.         error = acquireSuites( ((AIPluginMessage*)message)->d.basic );
  123.         if ( error )                                
  124.             goto error;                            
  125.  
  126.         if ( strcmp( selector, kSelectorAIStartupPlugin ) == 0 )
  127.             error = StartupPlugin( message );
  128.  
  129.         else if ( strcmp( selector, kSelectorAIAboutPlugin ) == 0 )
  130.             error = AboutPlugin( message );
  131.  
  132.         // other messages
  133.         else if ( strcmp( selector, kSelectorAIGoMenuItem ) == 0 )
  134.             error = goMenuItem( message );
  135.  
  136.         releaseSuites( ((AIPluginMessage*)message)->d.basic );
  137.     }    
  138.  
  139. error:
  140.     POP_GLOBALS
  141.     return error;
  142.  
  143. }
  144.  
  145.  
  146. static FXErr StartupPlugin ( AIPluginMessage *message ) {
  147.  
  148.     FXErr error = kNoErr;
  149.             
  150.     error = sBlock->AllocateBlock( sizeof(Globals), &g );
  151.     if ( error )
  152.         goto error;
  153.     
  154.     GetIndString( g->menuText, 16000, 1 ); // get the menu text
  155.     
  156.     addMyMenus( (AIMenuMessage*)message );
  157.  
  158. error:
  159.     return error;
  160.  
  161. }
  162.  
  163.  
  164. static FXErr UnloadPlugin( AIPluginMessage *message ) {
  165.  
  166.     CloseVideo();
  167.     message->d.globals = g; 
  168.     return kNoErr;                    
  169.  
  170. }
  171.  
  172.  
  173. static FXErr ReloadPlugin( AIPluginMessage *message ) {
  174.  
  175.     g = message->d.globals;
  176.     InitializeVideo();
  177.     return kNoErr;
  178.  
  179. }
  180.  
  181.  
  182. static FXErr ShutdownPlugin( AIPluginMessage *message ) {
  183.  
  184.     FXErr error = kNoErr;        
  185.     
  186. error:
  187.     return error;
  188.  
  189. }
  190.  
  191.  
  192.  
  193. /**-----------------------------------------------------------------------------
  194.  **
  195.  **    Suite Functions
  196.  **
  197.  **/
  198.  
  199.  
  200. extern FXErr acquireSuites( AIBasicSuite *sBasic ) {
  201.  
  202.     FXErr error = kNoErr;
  203.     long i;
  204.  
  205.     for ( i = 0; i < sizeof(imports)/sizeof(imports[0]); ++i ) {
  206.  
  207.         if ( imports[i].suite != NULL ) {
  208.             error = sBasic->AcquireSuite( imports[i].name, imports[i].version, imports[i].suite );
  209.             if ( error )
  210.                 goto error;
  211.         }
  212.  
  213.     }
  214.  
  215. error:
  216.     return error;
  217.  
  218. }
  219.  
  220.  
  221. extern FXErr releaseSuites( AIBasicSuite *sBasic ) {
  222.  
  223.     FXErr error = kNoErr;
  224.     long i;
  225.  
  226.     for ( i = 0; i < sizeof(imports)/sizeof(imports[0]); ++i ) {
  227.  
  228.         void **procs = imports[i].suite;
  229.  
  230.         if ( procs != NULL && *procs != NULL ) {
  231.             error = sBasic->ReleaseSuite( *procs );
  232.             if ( error )
  233.                 goto error;
  234.             *procs = NULL;
  235.         }
  236.  
  237.     }
  238.  
  239. error:
  240.     return error;
  241.  
  242. }
  243.  
  244.  
  245.  
  246.  
  247. /**-----------------------------------------------------------------------------
  248.  **
  249.  **    Other Functions
  250.  **
  251.  **/
  252.  
  253.  
  254. static FXErr AboutPlugin( AIPluginMessage *message ) {
  255.  
  256.     FXErr error = kNoErr;
  257.  
  258.     Alert( 16000, (ModalFilterUPP)sMacUser->ModalFilterProc );
  259.  
  260. error:
  261.     return error;
  262.  
  263. }
  264.  
  265.  
  266. extern void pstrcopy( unsigned char *from, unsigned char *to ) {
  267.  
  268.     short i;
  269.     
  270.     for(i=0;i<=from[0];i++) {
  271.     
  272.         to[i] = from[i];
  273.         
  274.     }
  275. }
  276.  
  277.  
  278.  
  279.  
  280. ////////////////////////
  281.  
  282.  
  283. static FXErr AcquireProperty( AIPropertyMessage *message ) {
  284.  
  285.     if ( message->vendorID == 'ADBE' &&
  286.          message->propertyKey == 'impt' ) {
  287.  
  288.         long count, i, datalen;
  289.         long strsize;
  290.         char *property;
  291.  
  292.         strsize = 0;
  293.  
  294.         count = sizeof(imports)/sizeof(imports[0]);
  295.         for ( i = 0; i < count; ++i ) {
  296.  
  297.             long len;
  298.  
  299.             len = strlen( imports[i].name ) + 1;
  300.             if ( len & 3 )
  301.                 len += 4 - (len & 3);
  302.             strsize += len;
  303.  
  304.         }
  305.  
  306.         datalen = 4 + strsize + count * 8;
  307.         property = NewPtrClear( 16 + datalen );
  308.         if ( property == NULL )
  309.             goto error;
  310.  
  311.         message->property = property;
  312.         message->refCon = 0;
  313.  
  314.         *(OSType *) property = 'ADBE';    // vendor ID
  315.         property += 4;
  316.         *(OSType *) property = 'impt';    // property key
  317.         property += 4;
  318.         *(long *) property = 0;            // property ID
  319.         property += 4;
  320.         *(long *) property = datalen;    // data len
  321.         property += 4;
  322.  
  323.         *(long *) property = count;
  324.         property += 4;
  325.  
  326.         for ( i = 0; i < count; ++i ) {
  327.  
  328.             long len;
  329.  
  330.             len = strlen( imports[i].name ) + 1;
  331.             if ( len & 3 )
  332.                 len += 4 - (len & 3);
  333.  
  334.             *(long *) property = len + 4;
  335.             property += 4;
  336.  
  337.             strcpy( property, imports[i].name );
  338.             property += len;
  339.  
  340.             *(long *) property = imports[i].version;
  341.             property += 4;
  342.  
  343.         }
  344.  
  345.     } else if ( message->vendorID == 'ADBE' &&
  346.          message->propertyKey == 'expt' ) {
  347.  
  348.         long count, i, datalen;
  349.         long strsize;
  350.         char *property;
  351.  
  352.         strsize = 0;
  353.  
  354.         count = sizeof(exports)/sizeof(exports[0]);
  355.         for ( i = 0; i < count; ++i ) {
  356.  
  357.             long len;
  358.  
  359.             len = strlen( exports[i].name ) + 1;
  360.             if ( len & 3 )
  361.                 len += 4 - (len & 3);
  362.             strsize += len;
  363.  
  364.         }
  365.  
  366.         datalen = 4 + strsize + count * 8;
  367.         property = NewPtrClear( 16 + datalen );
  368.         if ( property == NULL )
  369.             goto error;
  370.  
  371.         message->property = property;
  372.         message->refCon = 0;
  373.  
  374.         *(OSType *) property = 'ADBE';    // vendor ID
  375.         property += 4;
  376.         *(OSType *) property = 'expt';    // property key
  377.         property += 4;
  378.         *(long *) property = 0;            // property ID
  379.         property += 4;
  380.         *(long *) property = datalen;    // data len
  381.         property += 4;
  382.  
  383.         *(long *) property = count;
  384.         property += 4;
  385.  
  386.         for ( i = 0; i < count; ++i ) {
  387.  
  388.             long len;
  389.  
  390.             len = strlen( exports[i].name ) + 1;
  391.             if ( len & 3 )
  392.                 len += 4 - (len & 3);
  393.  
  394.             *(long *) property = len + 4;
  395.             property += 4;
  396.  
  397.             strcpy( property, exports[i].name );
  398.             property += len;
  399.  
  400.             *(long *) property = exports[i].version;
  401.             property += 4;
  402.  
  403.         }
  404.  
  405.     }
  406.  
  407. error:
  408.     return kNoErr;
  409.  
  410. }
  411.  
  412.  
  413. static FXErr ReleaseProperty( AIPropertyMessage *message ) {
  414.  
  415.     DisposePtr( message->property );
  416.  
  417.     return kNoErr;
  418.  
  419. }
  420.